/* ---------------------------------------------------------------- FONCTIONS */
/**
 * Détermine si une variable est NULL ou vide.
 */
function isNullOrEmpty(v) {
	if(v != null && v != "")
		return false;
	else
		return true;
}

/**
 * Détermine la taille (nombre d'éléments) d'un objet.
 */
function objectLength(o) {
	var r = 0;
	for(var p in o) {
		if(o.hasOwnProperty(p))
			r++;
	}
	return r;
};

/**
 * Recoit un timestamp et renvoi l'heure associée.
 */
function timestampToTime(timestamp) {
	var date = new Date(timestamp*1);
	var heure = date.getHours();
	var minutes = "0" + date.getMinutes();
	return heure + ":" + minutes.substr(minutes.length-2);
}

/**
 * Trie un tableau JSON en fonction d'un de ses attributs.
 */
function sortJsonByProperty(json, property, direction) {
	var d = (direction == "DESC" ? -1 : 1);

	if(json != null && json.constructor === Array) {
		var propPath = (property.constructor === Array) ? property : property.split(".");
		json.sort(function(a, b) {
			for(var p in propPath) {
				if(a[propPath[p]] && b[propPath[p]]) {
					a = a[propPath[p]];
					b = b[propPath[p]];
				}
			}
			a = a.match(/^\d+$/) ? +a : a;
			b = b.match(/^\d+$/) ? +b : b;
			return ( (a < b) ? -1*d : ((a > b) ? 1*d : 0) );
		});
	}
}



/* ----------------------------------------------------------- INITIALISATION */
$(function() {
	init();
});

function init() {
	refresh_user();


	$("#home_h3_span_1").tooltip();
	$("#home_h3_span_2").tooltip();
	$("#trains_h3_span_1").tooltip();


	/* Interception des envois de formulaires. ------------------------------ */
	a_form();
	
	// Connexion.
	$("#form_login").on("submit", function() {
		form_login();
		
		return false;
	});
	
	// Inscription.
	$("#form_subscribe").on("submit", function() {
		form_subscribe();
		
		return false;
	});
	
	// Recherche de trains pour parier.
	$("#form_search_train_station_dua").on("change", function() {
		$("#form_search_train").submit();
	});
	$("#form_search_train").on("submit", function() {
		form_search_train();
		
		return false;
	});
	
	// Recherche d'utilisateurs.
	$("#form_search_user").on("submit", function() {
		form_search_user();
		
		return false;
	});
	
	
	
	/* Affiche le contenu des tables au chargement de la page. -------------- */
	if($("#table_home_ratio").length > 0) {
		user_top_ten_ratio();
	}
	if($("#table_home_score").length > 0) {
		user_top_ten_score();
	}

	if($("#form_search_train").length > 0) {
		form_search_train();
	}

	if($("#table_challenges").length > 0) {
		challenges();
	}

	if($("#table_challenges_history").length > 0) {
		challenges_history();
	}

	if($("#table_friends_requests").length > 0) {
		friends_requests($("#table_friends_requests").attr("data-user_id"));
	}

	if($("#table_friends").length > 0) {
		friends($("#table_friends").attr("data-user_id"));
	}

	if($("#table_bets").length > 0) {
		bets();
	}

	if($("#table_bets_history").length > 0) {
		bets_history();
	}
	
	
	return false;
}

/**
 * Mise à jour des données de l'utilisateur.
 */
function refresh_user() {
	$.ajax({
		url: "S_UserRefresh",
		async: true,
		dataType: "html",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			if(xhr.status != 599) {
				console.error("Erreur refresh_user\n" + xhr.status + "\n" + thrownError);
			}
		},
		success: function(content) {
			$("#navbar_menuTop").replaceWith(content);
			a_form();
			setTimeout(refresh_user, 30000);
		}
	});
	
	return false;
}



/*
 * Interception des envois de formulaires avec les liens.
 */
function a_form() {
	$(".a_form").on("click", function() {
		a_form_action(this);
		
		return false;
	});
}

function a_form_action(a) {
	var action_1 = $(a).attr("data-action_1");
	switch(action_1) {
		case "challenge":
			a_form_action_challenge($(a).attr("data-action_2"), $(a).attr("data-id_cible"), $(a).attr("data-id_pari"), $(a).attr("data-id_defi"), $(a).attr("data-mise"), $(a).attr("data-retard"));
			break;
		case "friend":
			a_form_action_friend($(a).attr("data-action_2"), $(a).attr("data-id_ami"));
			break;
		case "logout":
			logout();
			break;
		default :
			break;
	}
	
	return false;
}

function a_form_action_friend(action_2, id_ami) {
	$.ajax({
		url: "S_FriendAction",
		async: true,
		data: {
			action: action_2,
			id_ami: id_ami
		},
		dataType: "json",
		type: "post",
		error: function(xhr, ajaxOptions, thrownError) {
			if(xhr.status == 599) {
				console.error("Erreur à la création d'une demande d'ami.");
			}
			else if(xhr.status == 598) {
				console.error("Erreur à l'acceptation d'une demande d'ami.");
			}
			else if(xhr.status == 597) {
				console.error("Erreur au refus d'une demande d'ami.");
			}
			else if(xhr.status == 596) {
				console.error("Erreur à la suppression d'une demande d'ami.");
			}
			else {
				console.error("Erreur a_form_action_friend\n" + xhr.status + "\n" + thrownError);
			}
		},
		success: function() {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = "friends";
		}
	});
	
	return false;
}

function a_form_action_challenge(action_2, id_cible, id_pari, id_defi, mise, retard) {
	$.ajax({
		url: "S_ChallengeAction",
		async: true,
		data: {
			action: action_2,
			id_cible: id_cible,
			id_pari: id_pari,
			id_defi: id_defi,
			mise: mise,
			retard: retard
		},
		dataType: "json",
		type: "post",
		error: function(xhr, ajaxOptions, thrownError) {
			if(xhr.status == 599) {
				console.error("Erreur à la création d'un défi.");
			}
			else if(xhr.status == 598) {
				console.error("Erreur à l'acceptation d'un défi.");
			}
			else if(xhr.status == 597) {
				console.error("Erreur au refus d'un défi.");
			}
			else {
				console.error("Erreur a_form_action_challenge\n" + xhr.status + "\n" + thrownError);
			}
		},
		success: function() {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = "challenges";
		}
	});
	
	return false;
}



/* -------------------------------------------------------------- FORMULAIRES */
/* CONNEXION ---------------------------------------------------------------- */
/**
 * Validation et envoi du formulaire de connexion.
 */
function form_login() {
	form_login_clean();
	var regex_mail = new RegExp('^[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*@[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*[\.]{1}[a-z]{2,6}$', 'i');
	
	// présence du mail
	if(!isNullOrEmpty($("#form_login_mail").val())) {
		// validité du mail (l'input étant de type "email", html5 le vérifie mais avec des contraintes moins fortes)
		if(regex_mail.test($("#form_login_mail").val())) {
			// présence du mot de passe
			if(!isNullOrEmpty($("#form_login_password").val())) {
				form_login_send($("#form_login_mail").val(), md5($("#form_login_password").val()));
			}
			else {
				$("#form_login_password").parent().addClass("has-error");
				$("#form_login_help").html("<strong class=\"text-danger\">Mot de passe non renseigné.</strong>");
			}
		}
		else {
			$("#form_login_mail").parent().addClass("has-error");
			$("#form_login_help").html("<strong class=\"text-danger\">Adresse mail non valide.</strong>");
		}
	}
	else {
		$("#form_login_mail").parent().addClass("has-error");
		$("#form_login_help").html("<strong class=\"text-danger\">Adresse mail non renseignée.</strong>");
	}
	
	return false;
}

/**
 * Nettoyage du CSS du formulaire de connexion.
 */
function form_login_clean() {
	$("#form_login_mail").parent().removeClass("has-error has-success");
	$("#form_login_password").parent().removeClass("has-error has-success");
	$("#form_login_help").html("");
}

/**
 * Envoi du formulaire de connexion.
 */
function form_login_send(mail, password) {
	$.ajax({
		url: "S_UserLogin",
		async: true,
		data: {
			mail: mail,
			password: password
		},
		dataType: "html",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			if(xhr.status == 599) {
				$("#form_login_help").html("<strong class=\"text-danger\">Informations de connexion incorrectes.</strong>");
			}
			else {
				console.error("Erreur form_login_send\n" + xhr.status + "\n" + thrownError);
			}
		},
		success: function() {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = url;
		}
	});
	
	return false;
}



/* INSCRIPTION -------------------------------------------------------------- */
/**
 * Validation du formulaire d'inscription.
 */
function form_subscribe() {
	form_subscribe_clean();
	var regex_mail = new RegExp('^[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*@[a-z0-9]+([_|\.|-]{1}[a-z0-9]+)*[\.]{1}[a-z]{2,6}$', 'i');
	var taille_min_pseudo = 3;
	var taille_max_pseudo = 50;
	var taille_min_mot_de_passe = 3;
	
	// présence du mail
	if(!isNullOrEmpty($("#form_subscribe_mail").val())) {
		// validité du mail (l'input étant de type "email", html5 le vérifie mais avec des contraintes moins fortes)
		if(regex_mail.test($("#form_subscribe_mail").val())) {
			// présence du pseudo
			if(!isNullOrEmpty($("#form_subscribe_pseudo").val())) {
				// taille minimale du pseudo
				if($("#form_subscribe_pseudo").val().trim().length >= taille_min_pseudo) {
					// taille maximale du pseudo
					if($("#form_subscribe_pseudo").val().trim().length <= taille_max_pseudo) {
						// présence du mot de passe
						if(!isNullOrEmpty($("#form_subscribe_password").val())) {
							// taille minimale du mot de passe
							if($("#form_subscribe_password").val().length >= taille_min_mot_de_passe) {
								// présence de la confirmation du mot de passe
								if(!isNullOrEmpty($("#form_subscribe_password_2").val())) {
									// comparaison des deux mots de passe
									if($("#form_subscribe_password").val() == $("#form_subscribe_password_2").val()) {
										form_subscribe_send($("#form_subscribe_mail").val(), $("#form_subscribe_pseudo").val(), md5($("#form_subscribe_password").val()));
									}
									else {
										$("#form_subscribe_help").html("<strong class=\"text-danger\">Les deux mots de passe ne correspondent pas.</strong>");
										$("#form_subscribe_password").parent().addClass("has-error");
										$("#form_subscribe_password_2").parent().addClass("has-error");
									}
								}
								else {
									$("#form_subscribe_help").html("<strong class=\"text-danger\">Confirmation du mot de passe non renseignée.</strong>");
									$("#form_subscribe_password_2").parent().addClass("has-error");
								}
							}
							else {
								$("#form_subscribe_help").html("<strong class=\"text-danger\">Le mot de passe doit comporter au moins " + taille_min_mot_de_passe + " caractères.</strong>");
								$("#form_subscribe_password").parent().addClass("has-error");
							}
						}
						else {
							$("#form_subscribe_help").html("<strong class=\"text-danger\">Mot de passe non renseigné.</strong>");
							$("#form_subscribe_password").parent().addClass("has-error");
						}
					}
					else {
						$("#form_subscribe_help").html("<strong class=\"text-danger\">Le pseudo doit comporter au plus " + taille_max_pseudo + " caractères.</strong>");
						$("#form_subscribe_pseudo").parent().addClass("has-error");
					}
				}
				else {
					$("#form_subscribe_help").html("<strong class=\"text-danger\">Le pseudo doit comporter au moins " + taille_min_pseudo + " caractères.</strong>");
					$("#form_subscribe_pseudo").parent().addClass("has-error");
				}
			}
			else {
				$("#form_subscribe_help").html("<strong class=\"text-danger\">Pseudo non renseigné.</strong>");
				$("#form_subscribe_pseudo").parent().addClass("has-error");
			}
		}
		else {
			$("#form_subscribe_help").html("<strong class=\"text-danger\">Adresse mail non valide.</strong>");
			$("#form_subscribe_mail").parent().addClass("has-error");
		}
	}
	else {
		$("#form_subscribe_help").html("<strong class=\"text-danger\">Adresse mail non renseignée.</strong>");
		$("#form_subscribe_mail").parent().addClass("has-error");
	}
	
	return false;
}

/**
 * Nettoyage du CSS du formulaire d'inscription.
 */
function form_subscribe_clean() {
	$("#form_subscribe_mail").parent().removeClass("has-error has-success");
	$("#form_subscribe_pseudo").parent().removeClass("has-error has-success");
	$("#form_subscribe_password").parent().removeClass("has-error has-success");
	$("#form_subscribe_password_2").parent().removeClass("has-error has-success");
	$("#form_subscribe_help").html("");
}

/**
 * Envoi du formulaire d'inscription.
 */
function form_subscribe_send(mail, pseudo, password) {
	$.ajax({
		url: "S_UserSubscribe",
		async: true,
		data: {
			mail: mail,
			pseudo: pseudo,
			password: password
		},
		dataType: "html",
		type: "post",
		error: function(xhr, ajaxOptions, thrownError) {
			if(xhr.status == 599) {
				$("#form_subscribe_help").html("<strong class=\"text-danger\">Inscription impossible, cette adresse mail est déjà utilisée.</strong>");
			}
			else {
				console.error("Erreur form_subscribe_send\n" + xhr.status + "\n" + thrownError);
			}
		},
		success: function() {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = url;
		}
	});
	
	return false;
}



/* DECONNEXION -------------------------------------------------------------- */
/**
 * Déconnexion.
 */
function logout() {
	$.ajax({
		url: "S_UserLogout",
		async: true,
		dataType: "html",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur logout\n" + xhr.status + "\n" + thrownError);
		},
		success: function() {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = url;
		}
	});
	
	return false;
}



/* --------------------------------------------------- RECHERCHE ET AFFICHAGE */
/* HOME --------------------------------------------------------------------- */
/**
 * Recherche les utilisateurs ayant le meilleur ratio.
 */
function user_top_ten_ratio() {
	$.ajax({
		url: "S_UserTopTenRatio",
		async: true,
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.log("Erreur user_top_ten_ratio\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			user_top_ten_ratio_display(content);
			setTimeout(user_top_ten_ratio, 30000);
		}
	});
	
	return false;
}

/**
 * Affiche les utilisateurs ayant le meilleur ratio.
 */
function user_top_ten_ratio_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"5\">Il n'y a pas encore d'utilisateur qui mérite d'être dans ce classement.</td></tr>";
	}
	else {
		for(var i = 0; i < i_max; i++) {
			html += "<tr>"
					+ "<td>"
						+ (i + 1)
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pseudo"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["score"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["nbParisJustes"] + " / " + json_data["@items"][i]["nbParisTotal"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["ratio"] * 100).toFixed(2) + " %"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_home_ratio>tbody").html(html);
}



/**
 * Recherche les utilisateurs ayant le meilleur score.
 */
function user_top_ten_score() {
	$.ajax({
		url: "S_UserTopTenScore",
		async: true,
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur user_top_ten_score\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			user_top_ten_score_display(content);
			setTimeout(user_top_ten_score, 30000);
		}
	});
	
	return false;
}

/**
 * Affiche les utilisateurs ayant le meilleur score.
 */
function user_top_ten_score_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"5\">Il n'y a pas encore d'utilisateur qui mérite d'être dans ce classement.</td></tr>";
	}
	else {
		for(var i = 0; i < i_max; i++) {
			html += "<tr>"
					+ "<td>"
						+ (i + 1)
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pseudo"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["score"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["nbParisJustes"] + " / " + json_data["@items"][i]["nbParisTotal"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["ratio"] * 100).toFixed(2) + " %"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_home_score>tbody").html(html);
}



/* RECHERCHE D'UTILISATEUR -------------------------------------------------- */
/**
 * Recherche les utilisateurs par pseudo.
 */
function form_search_user() {
	$.ajax({
		url: "S_UserSearch",
		async: true,
		data: {
			pseudo: $("#form_search_user_pseudo").val()
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur form_search_user\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			form_search_user_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les utilisateurs.
 */
function form_search_user_display(json_data) {
	console.log(json_data);
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"4\">Il n'y a aucun résultat à afficher.</td></tr>";
	}
	else {
		sortJsonByProperty(json_data["@items"], "ami.pseudo", "ASC");
		for(var i = 0; i < i_max; i++) {
			if(json_data["@items"][i]["sontAmis"]) {
				html += "<tr class=\"success\">"
						+ "<td>"
							+ "<span class=\"glyphicon glyphicon-star\"></span> "
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"supprimer\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-remove\" title=\"Supprimer de la liste d'amis\"></span></a>";
			}
			else if(json_data["@items"][i]["utilisateurDoitAccepter"]) {
				html += "<tr class=\"danger\">"
						+ "<td>"
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"accepter\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-ok\" title=\"Accepter la demande d'ami\"></span></a> "
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"refuser\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-remove\" title=\"Refuser la demande d'ami\"></span></a>";
			}
			else if(json_data["@items"][i]["amiDoitAccepter"]) {
				html += "<tr class=\"info\">"
						+ "<td>"
							+ "<span class=\"glyphicon glyphicon-star-empty\" title=\"Demande d'ami en attente de réponse\"></span>";
			}
			else {
				html += "<tr>"
						+ "<td>"
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"ajouter\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-plus\" title=\"Faire une demande d'ami\"></span></a>";
			}
			html += "</td>"	
					+ "<td>"
						+ json_data["@items"][i]["ami"]["pseudo"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["ami"]["score"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["ami"]["ratio"] * 100).toFixed(2) + " %"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_search_user>tbody").html(html);
	a_form();
}



/* AMI ---------------------------------------------------------------------- */
/**
 * Recherche les amis.
 */
function friends() {
	$.ajax({
		url: "S_Friend",
		async: true,
		data: {
			action: ""
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur amis\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			friends_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les amis.
 */
function friends_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"4\">Vous n'avez aucun ami. Désolé.</td></tr>";
	}
	else {
		sortJsonByProperty(json_data["@items"], "pseudo", "ASC");
		for(var i = 0; i < i_max; i++) {
			html += "<tr>"
					+ "<td>"
						+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"supprimer\" data-id_ami=\"" + json_data["@items"][i]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-remove\"></span></a>"
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pseudo"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["score"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["ratio"] * 100).toFixed(2) + " %"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_friends>tbody").html(html);
	a_form();
}



/**
 * Recherche les demandes d'ami.
 */
function friends_requests() {
	$.ajax({
		url: "S_FriendAction",
		async: true,
		data: {
			action: ""
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur demandes d'ami\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			friends_requests_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les demandes d'ami.
 */
function friends_requests_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"4\">Vous n'avez aucune demande d'ami en attente de réponse.</td></tr>";
	}
	else {
		sortJsonByProperty(json_data["@items"], "ami.pseudo", "ASC");
		for(var i = 0; i < i_max; i++) {
			if(json_data["@items"][i]["utilisateurDoitAccepter"]) {
				html += "<tr class=\"danger\">"
						+ "<td>"
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"accepter\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-ok\" title=\"Accepter la demande d'ami\"></span></a> "
							+ "<a class=\"a_form\" href=\"#\" data-action_1=\"friend\" data-action_2=\"refuser\" data-id_ami=\"" + json_data["@items"][i]["ami"]["id_utilisateur"] + "\"><span class=\"glyphicon glyphicon-remove\" title=\"Refuser la demande d'ami\"></span></a>";
			}
			else {
				html += "<tr class=\"info\">"
						+ "<td>"
							+ "<span class=\"glyphicon glyphicon-star-empty\" title=\"Demande d'ami en attente de réponse\"></span>";
			}
			html += "</td>"
					+ "<td>"
						+ json_data["@items"][i]["ami"]["pseudo"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["ami"]["score"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["ami"]["ratio"] * 100).toFixed(2) + " %"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_friends_requests>tbody").html(html);
	a_form();
}



/* PARIS -------------------------------------------------------------------- */
/**
 * Recherche les paris de l'utilisateur.
 */
function bets() {
	$.ajax({
		url: "S_BetAction",
		async: true,
		data: {
			action: ""
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur bets\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			bets_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les paris d'un utilisateur.
 */
function bets_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"5\">Vous n'avez aucun pari en cours.</td></tr>";
	}
	else {
		sortJsonByProperty(json_data["@items"], "passageTrainTheorique.arriveeTheorique.time", "ASC");
		for(var i = 0; i < i_max; i++) {
			html += "<tr>"
					+ "<td>"
						+ json_data["@items"][i]["garePassage"]["nom"]
						+ (json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] != null ? "<br/>" + json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] : "")
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["passageTrainTheorique"]["nomTrain"]
						+ "<br/>" + (json_data["@items"][i]["gareDestination"] != null ? json_data["@items"][i]["gareDestination"]["nom"] : "Information non fournie")
					+ "</td>"
					+ "<td>"
						+ timestampToTime(json_data["@items"][i]["passageTrainTheorique"]["arriveeTheorique"]["time"])
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pari"]["mise"] + " points sur " + json_data["@items"][i]["pari"]["retard"] + " min"
						+ "<br/>Gain potentiel : " + json_data["@items"][i]["pari"]["gainPossible"] + " points"
					+ "</td>"
					+ "<td id=\"table_bets_td_" + json_data["@items"][i]["pari"]["id_pari"] + "\">"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_bets>tbody").html(html);
	
	for(var i = 0; i < i_max; i++) {
		bets_display_form(json_data["@items"][i]["pari"]["id_pari"]);
	}
}

function bets_display_form(id_pari) {
	$.ajax({
		url: "form/form_new_challenge.jsp",
		async: true,
		data: {
			id_pari: id_pari
		},
		dataType: "html",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur bets_display\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			$("#table_bets_td_" + id_pari).html(content);
			$("#form_new_challenge_" + id_pari).on("submit", function() {
				$.ajax({
					url: "S_ChallengeAction",
					async: true,
					data: {
						action : "ajouter",
						id_pari: $(this).attr("data-id_bet"),
						id_cible: $(this).find("#form_new_challenge_target").val()
					},
					dataType: "html",
					type: "post",
					error: function(xhr, ajaxOptions, thrownError) {
						console.error("Erreur form_new_challenge\n" + xhr.status + "\n" + thrownError);
					},
					success: function(content) {
						var href = window.location.href.split("/");
						var url = "";
						for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
							url += href[i] + "/";
						}
						window.location.href = url + "bets";
					}
				});
				
				return false;
			});
		}
	});
	
	return false;
}



/**
 * Recherche l'historique des paris de l'utilisateur.
 */
function bets_history() {
	$.ajax({
		url: "S_Bet",
		async: true,
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur bets_history\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			bets_history_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche l'historique des paris d'un utilisateur.
 */
function bets_history_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"5\">Vous n'avez aucun pari dans votre historique.</td></tr>";
	}
	else {
		sortJsonByProperty(json_data["@items"], "pariHistorique.heurePassageTrain.time", "ASC");
		for(var i = 0; i < i_max; i++) {
			var tr_class = (json_data["@items"][i]["pariHistorique"]["gain"] > 0 ? "success" : "danger");
			html += "<tr class=\"" + tr_class + "\">"
					+ "<td>"
						+ json_data["@items"][i]["pariHistorique"]["nomGarePassage"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pariHistorique"]["nomTrain"]
						+ "<br/>" + json_data["@items"][i]["pariHistorique"]["nomGareDestination"]
					+ "</td>"
					+ "<td>"
						+ timestampToTime(json_data["@items"][i]["pariHistorique"]["heurePassageTrain"]["time"])
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pariHistorique"]["mise"] + " points sur " + json_data["@items"][i]["pariHistorique"]["retard"] + " min"
						+ "<br/>" + (json_data["@items"][i]["pariHistorique"]["gain"] > 0 ? ("Gain : " + json_data["@items"][i]["pariHistorique"]["gain"] + " points") : "Perdu")
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_bets_history>tbody").html(html);
}



/* RECHERCHE DES PROCHAINS TRAINS D'UNE GARE -------------------------------- */
/**
 * Recherche les prochains trains au passage d'une gare.
 */
function form_search_train() {
	$.ajax({
		url: "S_TrainSearch",
		async: true,
		data: {
			gare_dua: ""+$("#form_search_train_station_dua").val()
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur form_search_train\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			form_search_train_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les prochains trains d'une gare.
 */
function form_search_train_display(json_data) {
	var html = "";
	var i_max = Math.min(25, objectLength(json_data["@items"]));
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"5\">Il n'y a aucun train à afficher.</td></tr>";
	}
	else {
		for(var i = 0; i < i_max; i++) {
			html += "<tr class=\"clickable\" data-toggle=\"collapse\" data-target=\"#tr_form_new_bet_" + i + "\">"
					+ "<td>"
						+ json_data["@items"][i]["garePassage"]["nom"]
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] != null ? json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] : "-")
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["passageTrainTheorique"]["nomTrain"]
					+ "</td>"
					+ "<td>"
						+ timestampToTime(json_data["@items"][i]["passageTrainTheorique"]["arriveeTheorique"]["time"])
					+ "</td>"
					+ "<td>"
						+ (json_data["@items"][i]["gareDestination"] != null ? json_data["@items"][i]["gareDestination"]["nom"] : "Information non fournie")
					+ "</td>"
				+ "</tr>"
				+ "<tr class=\"collapse out budgets\" id=\"tr_form_new_bet_" + i + "\">"
					+ "<td colspan=\"5\" id=\"table_search_train_td_" + json_data["@items"][i]["passageTrainTheorique"]["id"] + "\">"
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_search_train>tbody").html(html);
	
	for(var i = 0; i < i_max; i++) {
		search_train_display_form(json_data["@items"][i]["passageTrainTheorique"]["id"]);
	}
}

/**
 * Renvoie le formulaire de nouveau pari.
 */
function search_train_display_form(id_passageTrainTheorique) {
	var html = "";
	$.ajax({
		url: "form/form_new_bet.jsp",
		async: true,
		data: {
			id_passageTrainTheorique: id_passageTrainTheorique
		},
		dataType: "html",
		type: "post",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur form_search_train_display\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			$("#table_search_train_td_" + id_passageTrainTheorique).html(content);
			$("#form_new_bet_" + id_passageTrainTheorique).on("submit", function() {
				form_new_bet(this);
				
				return false;
			});
		}
	});
	
	return false;
}

/**
 * Nouveau pari.
 */
function form_new_bet(form) {
	var id_passageTrainTheorique = $(form).attr("data-id_passageTrainTheorique");
	var mise = $(form).find("#form_new_bet_bet").val();
	var retard = $(form).find("#form_new_bet_duration").val();
	$.ajax({
		url: "S_BetAction",
		async: true,
		data: {
			action: "ajouter",
			id_passageTrainTheorique: id_passageTrainTheorique,
			retard: retard,
			mise: mise
		},
		dataType: "html",
		type: "post",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur form_new_bet\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			var href = window.location.href.split("/");
			var url = "";
			for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
				url += href[i] + "/";
			}
			window.location.href = url + "bets";
		}
	});
	
	return false;
}



/* DEFIS -------------------------------------------------------------------- */
/**
 * Recherche les défis en cours.
 */
function challenges() {
	$.ajax({
		url: "S_ChallengeAction",
		async: true,
		data: {
			action: "",
		},
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Error challenges\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			challenges_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche les défis.
 */
function challenges_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"4\">Vous n'avez aucun défi en cours.</td></tr>"
	}
	else {
		sortJsonByProperty(json_data["@items"], "passageTrainTheorique.arriveeTheorique.time", "ASC");
		for(var i = 0; i < i_max; i++) {
			html += "<tr class=\"" + (json_data["@items"][i]["pariUtilisateur"] == null ? "danger" : (json_data["@items"][i]["pariAdversaire"] == null ? "warning" : "info")) + "\">"
					+ "<td id=\"table_challenges_td_" + json_data["@items"][i]["defi"]["id_defi"] + "\">"
						+ (json_data["@items"][i]["pariUtilisateur"] != null ? "Vous avez misé " + json_data["@items"][i]["pariUtilisateur"]["mise"] + " pts sur " + json_data["@items"][i]["pariUtilisateur"]["retard"] + " min" : challenges_display_form(json_data["@items"][i]["defi"]["id_defi"]))
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["adversaire"]["pseudo"]
						+ (json_data["@items"][i]["pariAdversaire"] != null ? " a misé " + json_data["@items"][i]["pariAdversaire"]["mise"] + " pts sur " + json_data["@items"][i]["pariAdversaire"]["retard"] + " min" : " en attente d'une réponse")
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["nomGarePassage"]
						+ (json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] != null ? "<br/>" + json_data["@items"][i]["passageTrainTheorique"]["reseauTrain"] : "")
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["passageTrainTheorique"]["nomTrain"] + " de " + timestampToTime(json_data["@items"][i]["passageTrainTheorique"]["arriveeTheorique"]["time"])
						+ "<br/>" + (json_data["@items"][i]["nomGareDestination"] != "" ? json_data["@items"][i]["nomGareDestination"] : "Information non fournie")
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_challenges>tbody").html(html);
}

/**
 * Récupère le formulaire de réponse à un défi.
 */
function challenges_display_form(id_defi) {
	$.ajax({
		url: "form/form_challenge_response.jsp",
		async: true,
		data: {
			id_defi: id_defi
		},
		dataType: "html",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur challenges_form\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			$("#table_challenges_td_" + id_defi).html(content);
			a_form();
			$("#form_challenge_response_" + id_defi).on("submit", function() {
				$.ajax({
					url: "S_ChallengeAction",
					async: true,
					data: {
						action: "accepter",
						id_defi: id_defi,
						mise: $(this).find("#form_challenge_response_bet").val(),
						retard: $(this).find("#form_challenge_response_duration").val()
					},
					dataType: "json",
					type: "get",
					error: function(xhr, ajaxOptions, thrownError) {
						console.error("Error challenges\n" + xhr.status + "\n" + thrownError);
					},
					success: function(content) {
						var href = window.location.href.split("/");
						var url = "";
						for(var i = 0, i_max = href.length - 1; i < i_max; i++) {
							url += href[i] + "/";
						}
						window.location.href = url + "challenges";
					}
				});
				
				return false;
			});
		}
	});
	
	return false;
}



/**
 * Recherche l'historique des défis.
 */
function challenges_history() {
	$.ajax({
		url: "S_Challenge",
		async: true,
		dataType: "json",
		type: "get",
		error: function(xhr, ajaxOptions, thrownError) {
			console.error("Erreur challenges_history\n" + xhr.status + "\n" + thrownError);
		},
		success: function(content) {
			challenges_history_display(content);
		}
	});
	
	return false;
}

/**
 * Affiche l'historique des défis.
 */
function challenges_history_display(json_data) {
	var html = "";
	var i_max = objectLength(json_data["@items"]);
	if(i_max == 0) {
		html += "<tr class=\"info\"><td colspan=\"4\">Vous n'avez aucun défi dans votre historique.</td></tr>"
	}
	else {
		sortJsonByProperty(json_data["@items"], "pariHistoriqueUtilisateur.heurePassageTrain.time", "ASC");
		for(var i = 0; i < i_max; i++) {
			var tr_class = "";
			switch(json_data["@items"][i]["defiHistorique"]["etat"]) {
				case 0 :
					tr_class = "warning";
					break;
				case 1 :
					tr_class = json_data["@items"][i]["utilisateurADefie"] ? "success" : "danger";
					break;
				case 2 :
					tr_class = json_data["@items"][i]["utilisateurADefie"] ? "danger" : "success";
					break;
				case 3 :
					tr_class = "info";
					break;
			}
			html += "<tr class=\"" + tr_class + "\">"
					+ "<td>"
						+ "Vous avez misé " + json_data["@items"][i]["pariHistoriqueUtilisateur"]["mise"] + " pts sur " + json_data["@items"][i]["pariHistoriqueUtilisateur"]["retard"] + " min"
						+ "<br/>" + (json_data["@items"][i]["pariHistoriqueUtilisateur"]["gain"] > 0 ? json_data["@items"][i]["pariHistoriqueUtilisateur"]["gain"] + " pts gagnés" : "Perdu")
					+ "</td>"
					+ "<td>"
					+ json_data["@items"][i]["adversaire"]["pseudo"] + " a misé " + json_data["@items"][i]["pariHistoriqueAdversaire"]["mise"] + " pts sur " + json_data["@items"][i]["pariHistoriqueAdversaire"]["retard"] + " min"
						+ "<br/>" + (json_data["@items"][i]["pariHistoriqueAdversaire"]["gain"] > 0 ? json_data["@items"][i]["pariHistoriqueAdversaire"]["gain"] + " pts gagnés" : "Perdu")
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pariHistoriqueUtilisateur"]["nomGarePassage"]
					+ "</td>"
					+ "<td>"
						+ json_data["@items"][i]["pariHistoriqueUtilisateur"]["nomTrain"] + " de " + timestampToTime(json_data["@items"][i]["pariHistoriqueUtilisateur"]["heurePassageTrain"]["time"])
						+ "<br/>" + (json_data["@items"][i]["pariHistoriqueUtilisateur"]["nomGareDestination"] != "" ? json_data["@items"][i]["pariHistoriqueUtilisateur"]["nomGareDestination"] : "Information non fournie")
					+ "</td>"
				+ "</tr>";
		}
	}
	$("#table_challenges_history>tbody").html(html);
}